/**
 * 手机号中间星标
 * @param {Number,String} phone
 */
function mobileStar(phone) {
	let reg = /^(\d{3})\d{4}(\d{4})$/;
	return phone = phone.replace(reg, "$1****$2");
}

/**
 * 身份证中间星标 保留前面6位和后面4位
 * @param {Number,String} idcard 证件号
 * @param {Number,String} startNum 开头显示位数
 * @param {Number,String} endNum 结束显示位数
 */
function IdCardStar(idcard, startNum, endNum) {
	let newStr;
	if (idcard.length === 2) {
		newStr = idcard.substr(0, 1) + '*';
	} else if (idcard.length > 2) {
		let char = '';
		for (let i = 0, len = idcard.length - 10; i < len; i++) {
			char += '*';
		}
		newStr = idcard.substr(0, endNum) + char + idcard.substr(-startNum, startNum);
	} else {
		newStr = idcard;
	}
	return newStr;
}

/**
 * 时间函数
 * @param {Object} dataTime 时间参数
 * @param {Object} format 格式
 */
function getApiTime(dataTime, format) {
	let formateArr = ['Y', 'M', 'D', 'h', 'm', 's'];
	dataTime = dataTime || '';
	format = format || 'Y-M-D h:m:s';
	// 使用方式
	let returnArr = [];
	let date = '';
	// 根据传入的时间转换格式
	if (dataTime.toString().indexOf("-") == -1 && dataTime.toString().indexOf("/") == -1) {
		if (dataTime.toString().length > 10) {
			date = dataTime ? new Date(dataTime) : new Date();
		} else {
			date = dataTime ? new Date(dataTime * 1000) : new Date();
		}
	} else {
		date = dataTime ? new Date(dataTime.replace(/-/g, '/')) : new Date();
	}
	returnArr.push(date.getFullYear());
	returnArr.push(formatNumber(date.getMonth() + 1));
	returnArr.push(formatNumber(date.getDate()));
	returnArr.push(formatNumber(date.getHours()));
	returnArr.push(formatNumber(date.getMinutes()));
	returnArr.push(formatNumber(date.getSeconds()));
	for (let i in returnArr) {
		format = format.replace(formateArr[i], returnArr[i]);
	}
	return format;
}


/**
 * 时间转化格式 满10拼接0
 * @param {Number,String} n 时间数字
 */
function formatNumber(n) {
	n = n.toString()
	return n[1] ? n : '0' + n
}


/**
 * 加法运算
 * @param {Number,String} arg1
 * @param {Number,String} arg2
 */
function floatAdd(arg1, arg2) {
	let r1, r2, m;
	try {
		r1 = arg1.toString().split(".")[1].length
	} catch (e) {
		r1 = 0
	}
	try {
		r2 = arg2.toString().split(".")[1].length
	} catch (e) {
		r2 = 0
	}
	m = Math.pow(10, Math.max(r1, r2));
	return (arg1 * m + arg2 * m) / m;
}


/**
 * 减法运算
 * @param {Number,String} arg1
 * @param {Number,String} arg2
 */
function floatSub(arg1, arg2) {
	let r1, r2, m, n;
	try {
		r1 = arg1.toString().split(".")[1].length
	} catch (e) {
		r1 = 0
	}
	try {
		r2 = arg2.toString().split(".")[1].length
	} catch (e) {
		r2 = 0
	}
	m = Math.pow(10, Math.max(r1, r2));
	//动态控制精度长度   
	n = (r1 >= r2) ? r1 : r2;
	return ((arg1 * m - arg2 * m) / m).toFixed(n);
}


/**
 * 乘法运算
 * @param {Number,String} arg1
 * @param {Number,String} arg2
 */
function floatMul(arg1, arg2) {
	let m = 0,
		s1 = arg1.toString(),
		s2 = arg2.toString();
	try {
		m += s1.split(".")[1].length
	} catch (e) {}
	try {
		m += s2.split(".")[1].length
	} catch (e) {}
	return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m);
}


/**
 * 除法运算
 * @param {Number,String} arg1
 * @param {Number,String} arg2
 */
function floatp(arg1, arg2) {
	let t1 = 0,
		t2 = 0,
		r1, r2;
	try {
		t1 = arg1.toString().split(".")[1].length
	} catch (e) {}
	try {
		t2 = arg2.toString().split(".")[1].length
	} catch (e) {}
	r1 = Number(arg1.toString().replace(".", ""));
	r2 = Number(arg2.toString().replace(".", ""));
	return (r1 / r2) * Math.pow(10, t2 - t1);
}


/**
 * 包含带小数的数字处理，数字千位加逗号，分位保留
 * @param {Number,String} number
 */
function numComma(number) {
	number = number.toString()
	// 浮点数
	if (number.indexOf('.') != -1) {
		return number && number.replace(/(\d)(?=(\d{3})+\.)/g, '$1,');
	}
	// 整数
	return (number || 0).replace(/(\d)(?=(?:\d{3})+$)/g, '$1,')
}


/**
 * 科学计数法转换数字
 * @param {Number} x 数字
 */
function toFixed(x) {
	if (Math.abs(x) < 1.0) {
		let e = parseInt(x.toString().split('e-')[1]);
		if (e) {
			x *= Math.pow(10, e - 1);
			x = '0.' + (new Array(e)).join('0') + x.toString().substring(2);
		}
	} else {
		let e = parseInt(x.toString().split('+')[1]);
		if (e > 20) {
			e -= 20;
			x /= Math.pow(10, e);
			x += (new Array(e + 1)).join('0');
		}
	}
	return Number(x).toFixed(8);
}
/*
 * 计算两点之间的距离
 */
function GetDistance(lat1, lng1, lat2, lng2) {
	var radLat1 = lat1 * Math.PI / 180.0;
	var radLat2 = lat2 * Math.PI / 180.0;
	var a = radLat1 - radLat2;
	var b = lng1 * Math.PI / 180.0 - lng2 * Math.PI / 180.0;
	var s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math
		.sin(b / 2), 2)));
	s = s * 6378.137;
	s = Math.round(s * 10000) / 10000;
	return s
};

/*
 * 转换时间
 */
function normalizeDate(time) { //
	let date = new Date(time)
	let y = date.getFullYear()
	let m = date.getMonth() + 1;
	let d = date.getDate()
	return [y, m, d].map(v => padZero(v)).join('-')
};

/*
 * 图片压缩 使用h5 app 不支持小程序
 */
function compressImg(img, scale, callback) {
	plus.io.resolveLocalFileSystemURL(img, (entry) => { //通过URL参数获取目录对象或文件对象
		entry.file((file) => { // 可通过entry对象操作图片 
			// console.log('压缩前图片信息:' + JSON.stringify(file)); //压缩前图片信息
			if (file.size > 504800) { //   如果大于500Kb进行压缩
				plus.zip.compressImage({ // 5+ plus.zip.compressImage 了解一下，有详细的示例
					src: img, //src: 压缩原始图片的路径    
					dst: img.replace('.png', 'yasuo.png').replace('.PNG',
							'yasuo.PNG').replace('.jpg', 'yasuo.jpg')
						.replace('.JPG', 'yasuo.JPG'),
					width: '100%', //dst: (String 类型 )压缩转换目标图片的路径，这里先在后面原始名后面加一个yasuo区分一下
					height: '100%', //width,height: (String 类型 )缩放图片的宽度,高度
					quality: scale, //quality: (Number 类型 )压缩图片的质量
					overwrite: true, //overwrite: (Boolean 类型 )覆盖生成新文件
					// format:'jpg'   //format: (String 类型 )压缩转换后的图片格式
				}, (event) => {
					console.log('压缩后图片信息:' + JSON.stringify(event));
					//返回压缩后的图片路径
					callback(event.target);
				}, function(err) {
					console.log('Resolve file URL failed: ' + err.message);
				});
			} else { //else小于500kb跳过压缩，直接返回现有的src
				callback(img);

			}
		});
	}, (e) => { // 返回错误信息
		console.log('Resolve file URL failed: ' + e.message);
	});
};

/*
 * 复制
 */
function copyText(text) {
	uni.setClipboardData({
		data: text,
		success: () => {
			uni.showToast({
				title: '复制成功',
				icon: 'none',
				duration: 1500,
				mask: true
			});
		}
	});
};

/*
 * 获取系统剪贴板内容
 */
function getClipboardData() {
	uni.getClipboardData({
		success: (res) => {
			return res.data
		}
	})
};


function arrDistinctByProp(arr, prop) { //对象数组去重 arr数组 prop依据什么字段去重
	let obj = {};
	return arr.reduce(function(preValue, item) {
		obj[item[prop]] ? '' : obj[item[prop]] = true && preValue.push(item);
		return preValue
	}, [])
}

function objAssign(obj, objs) { //对象赋值给另一个对象部分属性 obj目标对象需要的属性 objs多属性对象
	Object.keys(obj).forEach(key => {
		obj[key] = objs[key] || obj[key]
	});
	return obj
}

function getH() { //获取状态栏高度
	return new Promise((resolve, reject) => {
		uni.getSystemInfo({
			success: (e) => {
				let statusBar = 0 //状态栏高度
				let customBar = 0 // 状态栏高度 + 导航栏高度  
				let navbar = 0 // 自定义标题与胶囊对齐高度

				// #ifdef MP
				statusBar = e.statusBarHeight
				customBar = e.statusBarHeight + 46
				if (e.platform === 'android') {
					customBar = e.statusBarHeight + 50
				}
				// #endif

				// #ifdef MP-WEIXIN
				statusBar = e.statusBarHeight
				const custom = wx.getMenuButtonBoundingClientRect()
				customBar = custom.bottom + custom.top - e.statusBarHeight + 4
				navbar = (custom.top - e.statusBarHeight) * 2 + custom.height
				// #endif

				// #ifdef MP-ALIPAY
				statusBar = e.statusBarHeight
				customBar = e.statusBarHeight + e.titleBarHeight
				// #endif


				// #ifdef APP-PLUS
				console.log('app-plus', e)
				statusBar = e.statusBarHeight
				customBar = e.statusBarHeight + 44
				// #endif


				// #ifdef H5
				statusBar = 0
				customBar = e.statusBarHeight + 46
				// #endif

				resolve(customBar)
			},
			fail: (err) => {
				reject(err)
			}
		})
	})
}

function debounce(fn, delay = 500) { //防抖
	let timer = null;
	return function() {
		const context = this;
		const args = arguments;
		clearTimeout(timer);
		timer = setTimeout(function() {
			fn.apply(context, args);
		}, delay);
	};
}
//使用
// confirm: tool.debounce(function() { //点击
// 	console.log('confirm事件');
// }, 500)


function classifyArr(arr, fields, isTime = '') { //把一个数组按某个字段的值 分成一个二维码数组
	//fields 字段 如按某个字段的值拆分
	//isTime 是否按时间顺序拆分成二维数组
	//arr  假设原始数组包含对象，每个对象都有一个时间属性排序

	// 使用 sort() 方法按时间属性进行排序
	if (isTime) {
		arr.sort(function(a, b) {
			return new Date(a[isTime]) - new Date(b[isTime]);
		});
	}
	// 创建一个对象来跟踪每个时间值对应的数组组
	let obj = {};
	arr.map((item) => {
		if (obj[item.fields]) {
			// 时间值已存在，将对象添加到对应的数组组中
			obj[item.fields].push(item);
		} else {
			// 时间值不存在，创建新的数组组并添加对象
			obj[item.fields] = [item];
		}
	});
	// 将对象转换为二维数组
	return Object.values(obj);
}






export default {

	mobileStar, // 手机号中间*标

	IdCardStar, // 证件号中间*标

	getApiTime, // 获取时间+格式化

	floatAdd, // 加法运算

	floatSub, // 减法运算

	floatMul, // 乘法运算

	floatp, // 除法运算

	numComma, // 包含带小数的数字处理，数字千位加逗号，分位保留

	toFixed, // 科学计数法转换数字

	GetDistance, //计算两点之间的距离

	normalizeDate, //转换时间

	compressImg, //压缩图片

	copyText, //复制

	getClipboardData, //获取系统剪贴板内容

	arrDistinctByProp, //对象数据去重

	objAssign, //对象赋值给另一个对象部分属性

	getH, //获取状态栏高度

	debounce, //防抖

	classifyArr, //数组按某个字段拆分为二维数组

}